本專案的BotServer和其他外部系統都在同一台EC2上運行,因此記憶體監控顯得格外重要,畢竟經費有限。
而在上一篇的描述中我們可以知道,影響成本最大的除了CPU外,就是記憶體的耗能,
為了確保應用程式順利執行,並能掌握記憶體的使用狀況,在進入後續章節之前,本文將先介紹如何在Linux環境中讓應用程式在背景執行,以及基本的記憶體監控指令。
這些指令將有助於我們確保程式順利運行,並且可以隨時監控記憶體的消耗狀態。
SIGHUP
訊號導致中斷。&
和 nohup
讓程式在背景執行,同時避免程式因為 SIGHUP
訊號而中止。$ 指令 &
在執行程式後加上 &
,即可讓程式在背景執行,在背景執行可以讓你不需要透過Ctrl + C中斷程式,也可以進行別的操作。
需要注意的是,當Linux發送SIGHUP
訊號時,程式仍然會中止,例如在退出終端機時。
SIGHUP:
$ nohup 指令 &
nohup
指令可以無視SIGHUP訊號,避免程式中止。然而,nohup 只負責防止訊號中止,要讓程式在背景執行,仍需加上 &
。在Linux中,定義了三個標準資料流:
stdin (0)
:標準輸入,預設是從鍵盤輸入。stdout (1)
:標準輸出,通常指一般的程式輸出。stderr (2)
:錯誤輸出,通常代表程式的Error log。stdout
和stderr
是否有區別,取決於應用程式有沒有對這兩種訊息的輸出做區分。/dev/null
: 丟棄輸出,有點像把訊息丟到黑洞去
/dev/null
是 Linux 中的特殊裝置檔案,用於丟棄不需要的輸出。可以使用這些符號,把一般的程式輸出或Error log寫到檔案。>
是指定檔案輸出,而代表資料流的符號和前面提到的背景執行一樣,都是Ampersand (&
),但用法不太相同。
使用方法如下:
&>檔名
x>檔名
&
所有
的資料流。&>檔名
代表著 把stdout和stderr全部輸出到指定的檔案
。2>&1
2>&1
代表把stderr輸出到stdout輸出的檔案
2>&1
和 &>檔名
的差別2>&1
有指定stdout的檔案名稱,他們的效用是一樣的,都是把所有輸出寫到同一個檔案。&>檔名
是Bash
特有的語法,只在Bash和一些支持此語法的Shell中可用。在其他一些Shell中(sh
),這個語法可能無效。2>&1
是更通用的語法,適用於大多數Unix-like系統的Shell。$ 指令 > out.file 2>&1
$ nohup 指令 > out.file 2>&1 &
# 前面的&1指的是資料流,最後的&代表程式要在背景執行,而開頭的nohup則是無視SIGHUP訊號,避免程式中止
$ nohup 指令 > /dev/null 2>&1 &
在終端機輸入top
就可以看到效能資訊,下面介紹一些top會顯示的資訊內容,以及一些名詞解釋:
top能顯示系統當前的CPU、Memory、Swap的使用率,以及各個Process的資源使用情況。
預設每隔幾秒鐘自動刷新一次,可以隨時查看系統的最新狀態。
預設情況下,Process依照CPU使用率排序,但可以根據需要按其他資源(例如記憶體使用量)進行排序。
OS會預定一部份的硬碟空間(磁區),當Memory不夠用時,會用個硬碟的空間充當記憶體來暫存資料。
Page
。